package com.wgy.day18.多态.向上转型和向下转型;
/*
向上转型的格式就是多态的格式:父类引用指向子类对象
父类名称 对象名称 = new 子类名称();
含义:右侧创建一个子类对象,把它当做父类来看待使用.
类似于: double num=100;//正确  int--->double, 自动类型转换.

注意事项:
向上转型一定是安全的,因为是从小范围转向了大范围,小范围的猫,向上转型成了更大范围的动物.
向上转型有一个弊端:对象一旦向上转型为父类,那么就无法调用子类原本特有的内容.
解决方案:只能向下转型 即还原回去

对象的向下转型,其实是一个还原的动作
格式:子类名称 对象名称=(子类名称)父类对象名称;
含义:将父类对象,还原成本来的子类对象
Animal animal=new Cat();//本来就是猫,被当做动物看待了
Cat cat= (Cat) animal;//本来就是猫, 已经被当做动物了,还原回来成为本来的猫

注意事项:
1.必须保证对象本来创建的时候,就是猫,才能向下转型成猫.
2.如果对象创建的时候不是猫,现在非要向下转型成为猫,就会运行报错. class cast exception


*/

public class Demo01Main {
    public static void main(String[] args) {
        //对象的向上转型   就是父类引用指向子类对象
        Animal animal=new Cat();//本来创建的时候是一只猫
        animal.eat();//猫吃鱼
      //  animal.catchMouse(); 错误写法.编译报错

        //向下转型,还原成原来的猫
        Cat cat=(Cat)animal;
        //转型回来后就可以调用自己原来特有的方法
        cat.catchMouse();

        //下面是错误的向下转型
        //本来是一只猫,现在非要当做狗
        //错误写法,编译不会报错,但是运行会出现异常
        //java.lang.ClassCastException,类转换异常
       // Dog dog=(Dog)animal;


    }
}
